#include "BaseScript.h"
#include "clazz.h"
#include "tools.h"

static int issame(lua_State *L);
static int __Clazz(lua_State *L);
static int __init(lua_State *L);


int lua_openbase(lua_State *L){
	lua_pushcfunction(L,issame);
	lua_setglobal(L,"issame");
	lua_pushcfunction(L,__Clazz);
	lua_setglobal(L,"Clazz");
	return 0;
}

int lua_closebase(lua_State *L){
	lua_pushnil(L);
	lua_setglobal(L,"issame");
	lua_pushnil(L);
	lua_setglobal(L,"Clazz");
	return 0;
}

int issame(lua_State *L){
	int top  = lua_gettop(L);
	if(top<2){
		lua_pushboolean(L,0);
	}else if(lua_rawequal(L,1,2)){
			lua_pushboolean(L,1);
	}else{
		if(lua_isuserdata(L,1) && lua_isuserdata(L,2)){
			if(touserdata(L,1) == touserdata(L,2)){
				lua_pushboolean(L,1);
			}else{
				if(queryModule(L,1)){
					lua_getfield(L,-1,"__eq");
					if(lua_isfunction(L,-1)){
						lua_pushvalue(L,1);
						lua_pushvalue(L,2);
						lua_pcall(L,2,1,0);
						return 1;
					}else{
						lua_pop(L,1);
					}
				}

				if(queryModule(L,2)){
					lua_getfield(L,-1,"__eq");
					if(lua_isfunction(L,-1)){
						lua_pushvalue(L,1);
						lua_pushvalue(L,2);
						lua_pcall(L,2,1,0);
						return 1;
					}else{
						lua_pop(L,1);
					}
				}

				lua_pushboolean(L,0);
			}
		}else{
			lua_pushboolean(L,0);
		}
	}
	return 1;
}

static int __Clazz(lua_State *L){
	int top = lua_gettop(L);
	BeginModule(L,0);
	ModuleConstructor(L,__init);

	for(int i = 1;i<=top;i++){
		if(lua_isstring(L,i)){
			ModuleExtends(L,lua_tostring(L,1));
		}else{
			ModuleExtendi(L,i);
		}
	}

	lua_pushvalue(L,-1);
	EndModule(L);
	return 1;
}

int __init(lua_State *L){
	return 0;
}